﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using UC.BaseMVVM;

namespace UC.Test.BaseMVVM.BaseModelValidacao
{
    [TestClass]
    public class ConfiguracoesDeUsoDaModelBase : BaseTestValidacao
    {
        [TestMethod]
        public void EstabelecerOPadraoDeQueAValidacaoEhFeitaJaNaInicializacaoDaView()
        {
            // arrange
            var modelBaseTest = ObterModelBaseTestMockadoComSuasDependencias();

            var configuracoesDeValidacao = modelBaseTest.Object.ObterConfiguracoesDeValidacao();

            // act
            var inicializarModelAutoValidando = configuracoesDeValidacao.InicializarModelAutoValidando;

            // assert
            Assert.IsTrue(inicializarModelAutoValidando);
        }

        private static Mock<ModelBaseFacade> ObterModelBaseTestMockadoComSuasDependencias()
        {
            var validadorConfig = new ModelBase.ValidadorConfig();
            var modelBaseTestMock = new Mock<ModelBaseFacade>(typeof (ModelBaseFacade), validadorConfig);
            // Mockar as dependëncias: OnValidatorErrors, OnErrorsChanged, _tipoObjetoModel, _propriedadesDoModel, ErrorsContainer
            return modelBaseTestMock;
        }

        [TestMethod]
        public void EstabelecerOTempoPadraoDe500MilissegundosAntesDeIniciarAValidacaoAhCadaAlteracaoNosCamposDaView()
        {
            // arrange
            var modelBaseTest = ObterModelBaseTestMockadoComSuasDependencias();

            // act
            var configuracoesDeValidacao = modelBaseTest.Object.ObterConfiguracoesDeValidacao();

            // assert
            Assert.AreEqual(500, configuracoesDeValidacao.TempoDeEsperaParaValidacao.TotalMilliseconds);
        }

        [TestMethod]
        public void EstabelecerOPadraoDeQueTodosOsCamposSalvoExcecoesDeveraoSerValidadosAhCadaDigitoInformado()
        {
            // arrange
            var modelBaseTest = ObterModelBaseTestMockadoComSuasDependencias();
            var configuracoesDeValidacao = modelBaseTest.Object.ObterConfiguracoesDeValidacao();

            // act
            var dispararValidacaoAhCadaDigitoInformadoNosCampos =
                configuracoesDeValidacao.DispararValidacaoAhCadaDigitoInformadoNosCampos;

            // assert
            Assert.IsTrue(dispararValidacaoAhCadaDigitoInformadoNosCampos);
        }

        //

        [TestMethod]
        public void PoderEscolherSeNaoQuizerQueAValidacaoSejaFeitaJaNaInicializacaoDaView()
        {
            // arrange
            var modelBaseTest = ObterModelBaseTestMockadoComSuasDependencias();
            var configuracoesDeValidacao = modelBaseTest.Object.ObterConfiguracoesDeValidacao();

            // act
            var valorInicialDaPropInicializarModelAutoValidando = configuracoesDeValidacao.InicializarModelAutoValidando;
            configuracoesDeValidacao.InicializarModelAutoValidando = false;

            // assert
            Assert.AreNotEqual(valorInicialDaPropInicializarModelAutoValidando, configuracoesDeValidacao.InicializarModelAutoValidando);
        }

        [TestMethod]
        public void PoderDefinirOTempoAIniciarAValidacaoAhCadaAlteracaoNosCamposDaView()
        {
            // arrange
            var modelBaseTest = ObterModelBaseTestMockadoComSuasDependencias();
            var configuracoesDeValidacao = modelBaseTest.Object.ObterConfiguracoesDeValidacao();

            // act
            var valorInicialDaPropTempoDeEspera = configuracoesDeValidacao.TempoDeEsperaParaValidacao;
            configuracoesDeValidacao.TempoDeEsperaParaValidacao = TimeSpan.FromMinutes(2);

            // assert
            Assert.AreNotEqual(valorInicialDaPropTempoDeEspera, configuracoesDeValidacao.TempoDeEsperaParaValidacao);
        }

        [TestMethod]
        public void PoderEscolherSeDesejaQueUmOuTodosOsCamposDaViewSejamValidadosAhCadaDigitoInformado()
        {
            // arrange
            var modelBaseTest = ObterModelBaseTestMockadoComSuasDependencias();
            var configuracoesDeValidacao = modelBaseTest.Object.ObterConfiguracoesDeValidacao();

            // act
            var valorInicialDaPropDispararValidacaoAhCadaDigitoInformado =
                configuracoesDeValidacao.DispararValidacaoAhCadaDigitoInformadoNosCampos;
            configuracoesDeValidacao.DispararValidacaoAhCadaDigitoInformadoNosCampos = !configuracoesDeValidacao.DispararValidacaoAhCadaDigitoInformadoNosCampos;

            // assert
            Assert.AreNotEqual(valorInicialDaPropDispararValidacaoAhCadaDigitoInformado,
                               configuracoesDeValidacao.DispararValidacaoAhCadaDigitoInformadoNosCampos);
        }
    }
}
